/*
 * @(#)ABC.java 2008-1-18
 * 
 * Copyright 2007 by ChinanetCenter Corporation.
 *
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * ChinanetCenter Corporation ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with ChinanetCenter.
 * 
 */
package com.cnc.beanutils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;

import org.apache.commons.beanutils.BeanUtils;


/**
 * @author 刘伟
 * @date   2008-1-18
 * @version 1.0
 */
public class Convert {
	
	 /**
     * 将资源文件转Map集合
     * @param rb 资源文件的ResourceBundle对象
     * @return 返回一个键值对我Map集合
     */
    @SuppressWarnings("unchecked")
	public static Map convertBundleToMap(ResourceBundle rb) {
        Map map = new HashMap();
        //通过获得资源文件的所有关键字获得对应值并且加信到Map集合中去
        for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) {
            String key = (String) keys.nextElement();
            map.put(key, rb.getString(key));
        }
        return map;
    }	
    
    public static Map convertBundleToMap(String url) {
    	ResourceBundle rb = ResourceBundle.getBundle(url);    	
        Map map = new HashMap();
        //通过获得资源文件的所有关键字获得对应值并且加信到Map集合中去
        for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) {
            String key = (String) keys.nextElement();
            map.put(key, rb.getString(key));
        }
        return map;
    }
      
    /**
     * 
     * 把资源文件转换成Properties对象
     * @param rb 资源文件的ResourceBundle对象
     * @return 返回一个Properties的对象
     */
    public static Properties convertBundleToProperties(ResourceBundle rb) {
    //	 Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 
    	Properties props = new Properties();

        for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) {
            String key = (String) keys.nextElement();
       //因为 Properties 继承于 Hashtable，所以可对 Properties 对象应用 put 和 putAll 方法。     
            props.put(key, rb.getString(key));
        }
        return props;
    }
    
    public static Properties convertBundleToProperties(String url) {
    	ResourceBundle rb = ResourceBundle.getBundle(url);
        //	 Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 
        	Properties props = new Properties();

            for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) {
                String key = (String) keys.nextElement();
           //因为 Properties 继承于 Hashtable，所以可对 Properties 对象应用 put 和 putAll 方法。     
                props.put(key, rb.getString(key));
            }
            return props;
        }
    /**
     * 将资源文件中的键值绑定到对象中
     * @param obj 将要被设置的对象
     * @param rb 资源文件的ResourceBundle对象
     * @return 返回被值绑定后的对象
     */
    public static Object populateObject(Object obj, ResourceBundle rb) {
        try {
           //先调用convertBundleToMap方法把资源文件转换成Map集合
        	Map map = convertBundleToMap(rb);
          //调用BeanUtils方法把map对象拷贝到obj对象里去
            BeanUtils.copyProperties(obj, map);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return obj;
    }
    /**
     * 通过Key ,获得将资源文件中value
     * @param key
     * @param rb
     * @return
     */
    public static String getString(String key,String url){
    	ResourceBundle rb = ResourceBundle.getBundle(url);
    	Map map = convertBundleToMap(rb);
    	String value = (String)map.get(key);
    	return value;
    }
    
    
    /**
     * 传入属性文件地址，获得Properties对象
     * @param url
     * @return
     */
    public static Properties getProperties(String url){
    	InputStream in = Convert.class.getClassLoader().getResourceAsStream(url);
		Properties prop = new Properties();
		try {
			if(in!=null){
				prop.load(in);			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally{
			if(in!=null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
    	
    	return prop;
    }

}


